package zpe.model;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.HashMap;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import zpe.genericcrud.model.Entidade;
import zpe.model.enums.SituacaoAgendamento;
import zpe.model.enums.TipoMovimentacao;
import zpe.model.enums.TipoRequisicao;

@Entity
@Table(name = "tb_agendamento", schema = "dbo")
public class Agendamento implements Entidade {

	private static final long serialVersionUID = 3176814900832143343L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ci_agendamento")
	private Integer id;
	
	@OneToMany(mappedBy = "agendamento", targetEntity = AgendamentoCarga.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true )
	private List<AgendamentoCarga> cargas = new ArrayList<AgendamentoCarga>();
	
	@OneToMany(mappedBy = "agendamento", targetEntity = AgendamentoItens.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true )
	private List<AgendamentoItens> itens = new ArrayList<AgendamentoItens>();
	
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "cd_tipo_requisicao",columnDefinition="int")
	private TipoRequisicao tipoRequisicao;
	
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "cd_tipo_movimentacao",columnDefinition="int")
	private TipoMovimentacao tipoMovimentacao;
	
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "cd_situacao_agendamento",columnDefinition="int")
	private SituacaoAgendamento situacaoAgendamento;
	
	@OneToOne
	@JoinColumn(name = "cd_proprietario",columnDefinition="int")
	private Cliente proprietario = new Cliente();
	
	@OneToOne
	@JoinColumn(name = "cd_transportador",columnDefinition="int")
	private Cliente transportador = new Cliente();
	
	@Column(name = "dt_previsao")
	private Date previsao;
	
	@Column(name = "dt_agendamento")
	private Timestamp agendamento;
	
	@Column(name = "ds_observacao")
	private String observacaoAgendamento;
	
	@Column(name = "ds_motivo_cancelamento")
	private String motivoCancelamento;
	
	@OneToOne
	@JoinColumn(name = "cd_motorista",columnDefinition="int")
	private Motorista motorista = new Motorista();
	
	@OneToOne
	@JoinColumn(name = "cd_veiculo_principal",columnDefinition="int")
	private Veiculo placaPrincipal = new Veiculo();
	
	@OneToOne
	@JoinColumn(name = "cd_veiculo_secundario1",columnDefinition="int")
	private Veiculo placaSecundaria1 = new Veiculo();
	
	@OneToOne
	@JoinColumn(name = "cd_veiculo_secundario2",columnDefinition="int")
	private Veiculo placaSecundaria2 = new Veiculo();
	
	public Agendamento(){
	}
	
	public Integer getId() {
		return id;
	}

	public List<AgendamentoCarga> getCargas() {
		return cargas;
	}

	public void setCargas(List<AgendamentoCarga> cargas) {
		this.cargas = cargas;
	}
	
	public List<AgendamentoItens> getItens() {
		return itens;
	}

	public void setItens(List<AgendamentoItens> itens) {
		this.itens = itens;
	}

	public TipoRequisicao getTipoRequisicao() {
		return tipoRequisicao;
	}

	public void setTipoRequisicao(TipoRequisicao tipoRequisicao) {
		this.tipoRequisicao = tipoRequisicao;
	}

	public TipoMovimentacao getTipoMovimentacao() {
		return tipoMovimentacao;
	}

	public Motorista getMotorista() {
		return motorista;
	}

	public void setMotorista(Motorista motorista) {
		this.motorista = motorista;
	}

	public Veiculo getPlacaPrincipal() {
		return placaPrincipal;
	}

	public void setPlacaPrincipal(Veiculo placaPrincipal) {
		this.placaPrincipal = placaPrincipal;
	}

	public Veiculo getPlacaSecundaria1() {
		return placaSecundaria1;
	}

	public void setPlacaSecundaria1(Veiculo placaSecundaria1) {
		this.placaSecundaria1 = placaSecundaria1;
	}

	public Veiculo getPlacaSecundaria2() {
		return placaSecundaria2;
	}

	public void setPlacaSecundaria2(Veiculo placaSecundaria2) {
		this.placaSecundaria2 = placaSecundaria2;
	}

	public void setTipoMovimentacao(TipoMovimentacao tipoMovimentacao) {
		this.tipoMovimentacao = tipoMovimentacao;
	}

	public Cliente getProprietario() {
		return proprietario;
	}

	public void setProprietario(Cliente proprietario) {
		this.proprietario = proprietario;
	}

	public Cliente getTransportador() {
		return transportador;
	}

	public void setTransportador(Cliente transportador) {
		this.transportador = transportador;
	}

	public Date getPrevisao() {
		return previsao;
	}

	public void setPrevisao(Date previsao) {
		this.previsao = previsao;
	}

	public SituacaoAgendamento getSituacaoAgendamento() {
		return situacaoAgendamento;
	}

	public void setSituacaoAgendamento(SituacaoAgendamento situacaoAgendamento) {
		this.situacaoAgendamento = situacaoAgendamento;
	}

	public Timestamp getAgendamento() {
		return agendamento;
	}

	public void setAgendamento(Timestamp agendamento) {
		this.agendamento = agendamento;
	}

	public String getObservacaoAgendamento() {
		return observacaoAgendamento;
	}

	public void setObservacaoAgendamento(String observacaoAgendamento) {
		this.observacaoAgendamento = observacaoAgendamento;
	}

	public String getMotivoCancelamento() {
		return motivoCancelamento;
	}

	public void setMotivoCancelamento(String motivoCancelamento) {
		this.motivoCancelamento = motivoCancelamento;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	public static long getSerialVersionUID() {
		return serialVersionUID;
	}

	public Map<String, Object> notEmptyFields() {
		Map<String, Object> map = new HashMap<String, Object>();
		return map;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Agendamento other = (Agendamento) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}
